package busterminal.command.bus;

import busterminal.command.AbstractCommand;
import busterminal.entity.Bus;
import busterminal.entity.BusImplementation;
import busterminal.entity.BusModel;
import busterminal.entity.service.PurposeType;
import busterminal.exception.BusinessException;
import busterminal.persistence.BusDAO;
import busterminal.persistence.BusModelDAO;
import busterminal.services.ServiceLocator;
import java.util.Arrays;
import java.util.List;

/**
 * Класс, реализуюий действие: создание нового автобуса
 */
public class CreateBusCommand extends AbstractCommand {

    /**
     * Имя параметра "Государственный номер"
     */
    private final static String PARAM_STATE_NUMBER = "State number";
    /**
     * Имя параметра "Идентификатор модели автобуса"
     */
    private final static String PARAM_MODEL_BUS_ID = "Model bus id";
    /**
     * Имя параметра "Год начала эксплуатации"
     */
    private final static String PARAM_START_YEAR_OF_EXPLOITATION = "Start year of exploitation";
    /**
     * Имя параметра "Назначение автобуса"
     */
    private final static String PARAM_PURPOSE_TYPE = "Purpose type";

    /**
     * Конструктор по умолчанию
     */
    public CreateBusCommand() {
        super("Add new bus");
    }

    /**
     * Выполнить команду: создать новый автобус
     */
    @Override
    public void execute() {
        Bus bus = new BusImplementation();
        bus.setStateNumber(parameters.get(PARAM_STATE_NUMBER));
        String parametrId = parameters.get(PARAM_MODEL_BUS_ID);
        int ID;
        try {
            ID = Integer.parseInt(parametrId);
        } catch(Exception e) {
            throw new BusinessException("Invalid model bus ID='" + parametrId + "';" + e.toString(), e);
        }        
        
        BusModel busModel = ServiceLocator.getService(BusModelDAO.class).read(ID);
        if (busModel == null) {
            throw new  BusinessException("Cannot find bus model with id='" + ID + "'");
        }
        bus.setBusModel(busModel);
        
        String parametrStartYearOfExploitation = parameters.get(PARAM_START_YEAR_OF_EXPLOITATION);
        int startYearOfExploitation;
        try {
            startYearOfExploitation = Integer.parseInt(parametrStartYearOfExploitation);
        } catch(Exception e) {
            throw new BusinessException("Invalid start year of exploitation='" + parametrStartYearOfExploitation + "';" + e.toString(), e);
        }
        bus.setStartYearOfExploitation(startYearOfExploitation);
        String purposeType = parameters.get(PARAM_PURPOSE_TYPE);
        try {
            bus.setPurposeType(PurposeType.valueOf(purposeType.toUpperCase()));
        } catch(Exception e) {
            System.err.println("Incorrect purpose type " + purposeType);
        }

        BusDAO busDAO = ServiceLocator.getService(BusDAO.class);
        busDAO.create(bus);
    }

    /**
     * Получить список имён параметров
     * @return список имён параметров
     */
    @Override
    public List<String> getParametersNames() {
        return Arrays.asList(PARAM_STATE_NUMBER, PARAM_MODEL_BUS_ID, PARAM_START_YEAR_OF_EXPLOITATION, PARAM_PURPOSE_TYPE);
    }
    
    /**
     * Вывести список доступных вариантов параметра с фиксированным набором значений
     * @param parameterName имя параметра с фиксированным набором значений
     */
    @Override
    public void showAccessableVariants(String parameterName) {
        if (PARAM_PURPOSE_TYPE.equals(parameterName)) {
            System.out.println("Accessable variants: " + PurposeType.getValues());
        }
    }    
}
